package study.JavaBase;

/**
 * date:2025.10.16
 * title:多态
 * author:fzy
 */
public class Java_19 {
    public static void main(String[] args) {
//        Dog d = new Dog();
//        Cat c = new Cat();
//        ToDoClass.todo(d);
//        ToDoClass.todo(c);
 /*
多态转型
1.向上转型
由子到父，父类引用转为子类对象:
Animal A = new cat()
2.向下转型
...............
本质就是强转

 */
//向上转型:多态访问成员变量要看左边类型，运行的内容要看右边运行的实际结果
//        Animal aniA = new Dog();
//        //向下转型
//        Dog dg = (Dog) aniA;
//        dg.testFly();



//多态的好处，直接用父类作为参数类型，传递其中的继承类，这样有利于扩展
        //相当于Animal param = new cat()
        //param.eat()
        //当然这样的缺点就是无法使用继承类特定的方法，可以通过重载方法实现继承类特定方法的调用
//        AnimalOperation.animalEat(c);
//        AnimalOperation.animalEat(d);
//案例测试
        cat_test catTest = new cat_test("凯瑞");
        dog_test dogTest = new dog_test("汤姆");
        animalDemo.test(catTest);
        animalDemo.test(dogTest);
        System.out.println("the cat name is:"+ catTest.getName());
 }
}
//多态就是同一个行为在不同的实例中发生不同的结果
//就如同下面的这个，都是运行的动物的吃跑方法，猫实例和狗实例运行的结果不一样

final class ToDoClass {
    static void todo(Animal animal) {
        try {
            animal.run();
            animal.eat();

        } catch (MyError e) {
            e.printStackTrace();
        }
    }
}

class AnimalOperation {
    static void animalEat(Animal ani) {
        ani.run();
    }

    static void animalEat(Dog ani) {
        ani.testFly();
    }
}

abstract class Animal {
    abstract void eat() throws MyError;

    abstract void run();
}

class MyError extends Exception {
    @Override
    public void printStackTrace() {
        System.out.println("应激哈气了");
    }
}

class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("大狗嚼");
    }

    @Override
    void run() {
        System.out.println("大狗跑");
    }

    void testFly() {
        System.out.println("小狗尝试飞行");
    }
}

class Cat extends Animal {
    @Override
    void eat() throws MyError {
        System.out.println("哈机密");
        throw new MyError();
    }

    @Override
    void run() {
        System.out.println("小猫牢底");
    }
}

//案例测试-----------------------------
//猫和狗
class Animal_test{
    private String name;
    Animal_test(){

    }
    Animal_test(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    void eat(){
        System.out.println(this.name+"吃饭");
    }
}

class cat_test extends Animal_test{
    cat_test(){
        super();
    }
    cat_test(String name){
        super(name);
    }

    @Override
    void eat() {
        System.out.println("猫吃饭");
    }
}

class dog_test extends Animal_test{
    dog_test(){
        super();
    }
    dog_test(String name){
        super(name);
    }

    @Override
    void eat() {
        System.out.println("狗吃饭");
    }
}
class animalDemo{
    static void test(Animal_test ani){
        ani.eat();
    }
}